//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2021 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto/tree/main/CodeGenerator. DO NOT EDIT.

import Foundation
import SotoCore

extension AppConfig {
    // MARK: Enums

    public enum DeploymentEventType: String, CustomStringConvertible, Codable {
        case bakeTimeStarted = "BAKE_TIME_STARTED"
        case deploymentCompleted = "DEPLOYMENT_COMPLETED"
        case deploymentStarted = "DEPLOYMENT_STARTED"
        case percentageUpdated = "PERCENTAGE_UPDATED"
        case rollbackCompleted = "ROLLBACK_COMPLETED"
        case rollbackStarted = "ROLLBACK_STARTED"
        public var description: String { return self.rawValue }
    }

    public enum DeploymentState: String, CustomStringConvertible, Codable {
        case baking = "BAKING"
        case complete = "COMPLETE"
        case deploying = "DEPLOYING"
        case rolledBack = "ROLLED_BACK"
        case rollingBack = "ROLLING_BACK"
        case validating = "VALIDATING"
        public var description: String { return self.rawValue }
    }

    public enum EnvironmentState: String, CustomStringConvertible, Codable {
        case deploying = "DEPLOYING"
        case readyForDeployment = "READY_FOR_DEPLOYMENT"
        case rolledBack = "ROLLED_BACK"
        case rollingBack = "ROLLING_BACK"
        public var description: String { return self.rawValue }
    }

    public enum GrowthType: String, CustomStringConvertible, Codable {
        case exponential = "EXPONENTIAL"
        case linear = "LINEAR"
        public var description: String { return self.rawValue }
    }

    public enum ReplicateTo: String, CustomStringConvertible, Codable {
        case none = "NONE"
        case ssmDocument = "SSM_DOCUMENT"
        public var description: String { return self.rawValue }
    }

    public enum TriggeredBy: String, CustomStringConvertible, Codable {
        case appconfig = "APPCONFIG"
        case cloudwatchAlarm = "CLOUDWATCH_ALARM"
        case internalError = "INTERNAL_ERROR"
        case user = "USER"
        public var description: String { return self.rawValue }
    }

    public enum ValidatorType: String, CustomStringConvertible, Codable {
        case jsonSchema = "JSON_SCHEMA"
        case lambda = "LAMBDA"
        public var description: String { return self.rawValue }
    }

    // MARK: Shapes

    public struct Application: AWSDecodableShape {
        /// The description of the application.
        public let description: String?
        /// The application ID.
        public let id: String?
        /// The application name.
        public let name: String?

        public init(description: String? = nil, id: String? = nil, name: String? = nil) {
            self.description = description
            self.id = id
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case description = "Description"
            case id = "Id"
            case name = "Name"
        }
    }

    public struct Applications: AWSDecodableShape {
        /// The elements from this collection.
        public let items: [Application]?
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?

        public init(items: [Application]? = nil, nextToken: String? = nil) {
            self.items = items
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case items = "Items"
            case nextToken = "NextToken"
        }
    }

    public struct Configuration: AWSDecodableShape & AWSShapeWithPayload {
        /// The key for the payload
        public static let _payloadPath: String = "content"
        public static let _payloadOptions: AWSShapePayloadOptions = [.raw]
        public static var _encoding = [
            AWSMemberEncoding(label: "configurationVersion", location: .header(locationName: "Configuration-Version")),
            AWSMemberEncoding(label: "content", location: .body(locationName: "Content")),
            AWSMemberEncoding(label: "contentType", location: .header(locationName: "Content-Type"))
        ]

        /// The configuration version.
        public let configurationVersion: String?
        /// The content of the configuration or the configuration data.
        public let content: AWSPayload?
        /// A standard MIME type describing the format of the configuration content. For more information, see Content-Type.
        public let contentType: String?

        public init(configurationVersion: String? = nil, content: AWSPayload? = nil, contentType: String? = nil) {
            self.configurationVersion = configurationVersion
            self.content = content
            self.contentType = contentType
        }

        private enum CodingKeys: String, CodingKey {
            case configurationVersion = "Configuration-Version"
            case content = "Content"
            case contentType = "Content-Type"
        }
    }

    public struct ConfigurationProfile: AWSDecodableShape {
        /// The application ID.
        public let applicationId: String?
        /// The configuration profile description.
        public let description: String?
        /// The configuration profile ID.
        public let id: String?
        /// The URI location of the configuration.
        public let locationUri: String?
        /// The name of the configuration profile.
        public let name: String?
        /// The ARN of an IAM role with permission to access the configuration at the specified LocationUri.
        public let retrievalRoleArn: String?
        /// A list of methods for validating the configuration.
        public let validators: [Validator]?

        public init(applicationId: String? = nil, description: String? = nil, id: String? = nil, locationUri: String? = nil, name: String? = nil, retrievalRoleArn: String? = nil, validators: [Validator]? = nil) {
            self.applicationId = applicationId
            self.description = description
            self.id = id
            self.locationUri = locationUri
            self.name = name
            self.retrievalRoleArn = retrievalRoleArn
            self.validators = validators
        }

        private enum CodingKeys: String, CodingKey {
            case applicationId = "ApplicationId"
            case description = "Description"
            case id = "Id"
            case locationUri = "LocationUri"
            case name = "Name"
            case retrievalRoleArn = "RetrievalRoleArn"
            case validators = "Validators"
        }
    }

    public struct ConfigurationProfileSummary: AWSDecodableShape {
        /// The application ID.
        public let applicationId: String?
        /// The ID of the configuration profile.
        public let id: String?
        /// The URI location of the configuration.
        public let locationUri: String?
        /// The name of the configuration profile.
        public let name: String?
        /// The types of validators in the configuration profile.
        public let validatorTypes: [ValidatorType]?

        public init(applicationId: String? = nil, id: String? = nil, locationUri: String? = nil, name: String? = nil, validatorTypes: [ValidatorType]? = nil) {
            self.applicationId = applicationId
            self.id = id
            self.locationUri = locationUri
            self.name = name
            self.validatorTypes = validatorTypes
        }

        private enum CodingKeys: String, CodingKey {
            case applicationId = "ApplicationId"
            case id = "Id"
            case locationUri = "LocationUri"
            case name = "Name"
            case validatorTypes = "ValidatorTypes"
        }
    }

    public struct ConfigurationProfiles: AWSDecodableShape {
        /// The elements from this collection.
        public let items: [ConfigurationProfileSummary]?
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?

        public init(items: [ConfigurationProfileSummary]? = nil, nextToken: String? = nil) {
            self.items = items
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case items = "Items"
            case nextToken = "NextToken"
        }
    }

    public struct CreateApplicationRequest: AWSEncodableShape {
        /// A description of the application.
        public let description: String?
        /// A name for the application.
        public let name: String
        /// Metadata to assign to the application. Tags help organize and categorize your AppConfig resources. Each tag consists of a key and an optional value, both of which you define.
        public let tags: [String: String]?

        public init(description: String? = nil, name: String, tags: [String: String]? = nil) {
            self.description = description
            self.name = name
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.description, name: "description", parent: name, max: 1024)
            try self.validate(self.description, name: "description", parent: name, min: 0)
            try self.validate(self.name, name: "name", parent: name, max: 64)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.tags?.forEach {
                try validate($0.key, name: "tags.key", parent: name, max: 128)
                try validate($0.key, name: "tags.key", parent: name, min: 1)
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, max: 256)
            }
        }

        private enum CodingKeys: String, CodingKey {
            case description = "Description"
            case name = "Name"
            case tags = "Tags"
        }
    }

    public struct CreateConfigurationProfileRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "applicationId", location: .uri(locationName: "ApplicationId"))
        ]

        /// The application ID.
        public let applicationId: String
        /// A description of the configuration profile.
        public let description: String?
        /// A URI to locate the configuration. You can specify a Systems Manager (SSM) document, an SSM Parameter Store parameter, or an Amazon S3 object. For an SSM document, specify either the document name in the format ssm-document://&lt;Document_name&gt; or the Amazon Resource Name (ARN). For a parameter, specify either the parameter name in the format ssm-parameter://&lt;Parameter_name&gt; or the ARN. For an Amazon S3 object, specify the URI in the following format: s3://&lt;bucket&gt;/&lt;objectKey&gt; . Here is an example: s3://my-bucket/my-app/us-east-1/my-config.json
        public let locationUri: String
        /// A name for the configuration profile.
        public let name: String
        /// The ARN of an IAM role with permission to access the configuration at the specified LocationUri.
        public let retrievalRoleArn: String?
        /// Metadata to assign to the configuration profile. Tags help organize and categorize your AppConfig resources. Each tag consists of a key and an optional value, both of which you define.
        public let tags: [String: String]?
        /// A list of methods for validating the configuration.
        public let validators: [Validator]?

        public init(applicationId: String, description: String? = nil, locationUri: String, name: String, retrievalRoleArn: String? = nil, tags: [String: String]? = nil, validators: [Validator]? = nil) {
            self.applicationId = applicationId
            self.description = description
            self.locationUri = locationUri
            self.name = name
            self.retrievalRoleArn = retrievalRoleArn
            self.tags = tags
            self.validators = validators
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationId, name: "applicationId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.description, name: "description", parent: name, max: 1024)
            try self.validate(self.description, name: "description", parent: name, min: 0)
            try self.validate(self.locationUri, name: "locationUri", parent: name, max: 2048)
            try self.validate(self.locationUri, name: "locationUri", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, max: 64)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.retrievalRoleArn, name: "retrievalRoleArn", parent: name, max: 2048)
            try self.validate(self.retrievalRoleArn, name: "retrievalRoleArn", parent: name, min: 20)
            try self.validate(self.retrievalRoleArn, name: "retrievalRoleArn", parent: name, pattern: "^((arn):(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):(iam)::\\d{12}:role[/].*)$")
            try self.tags?.forEach {
                try validate($0.key, name: "tags.key", parent: name, max: 128)
                try validate($0.key, name: "tags.key", parent: name, min: 1)
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, max: 256)
            }
            try self.validators?.forEach {
                try $0.validate(name: "\(name).validators[]")
            }
            try self.validate(self.validators, name: "validators", parent: name, max: 2)
            try self.validate(self.validators, name: "validators", parent: name, min: 0)
        }

        private enum CodingKeys: String, CodingKey {
            case description = "Description"
            case locationUri = "LocationUri"
            case name = "Name"
            case retrievalRoleArn = "RetrievalRoleArn"
            case tags = "Tags"
            case validators = "Validators"
        }
    }

    public struct CreateDeploymentStrategyRequest: AWSEncodableShape {
        /// Total amount of time for a deployment to last.
        public let deploymentDurationInMinutes: Int
        /// A description of the deployment strategy.
        public let description: String?
        /// The amount of time AppConfig monitors for alarms before considering the deployment to be complete and no longer eligible for automatic roll back.
        public let finalBakeTimeInMinutes: Int?
        /// The percentage of targets to receive a deployed configuration during each interval.
        public let growthFactor: Float
        /// The algorithm used to define how percentage grows over time. AWS AppConfig supports the following growth types:  Linear: For this type, AppConfig processes the deployment by dividing the total number of targets by the value specified for Step percentage. For example, a linear deployment that uses a Step percentage of 10 deploys the configuration to 10 percent of the hosts. After those deployments are complete, the system deploys the configuration to the next 10 percent. This continues until 100% of the targets have successfully received the configuration.  Exponential: For this type, AppConfig processes the deployment exponentially using the following formula: G*(2^N). In this formula, G is the growth factor specified by the user and N is the number of steps until the configuration is deployed to all targets. For example, if you specify a growth factor of 2, then the system rolls out the configuration as follows:  2*(2^0)   2*(2^1)   2*(2^2)  Expressed numerically, the deployment rolls out as follows: 2% of the targets, 4% of the targets, 8% of the targets, and continues until the configuration has been deployed to all targets.
        public let growthType: GrowthType?
        /// A name for the deployment strategy.
        public let name: String
        /// Save the deployment strategy to a Systems Manager (SSM) document.
        public let replicateTo: ReplicateTo
        /// Metadata to assign to the deployment strategy. Tags help organize and categorize your AppConfig resources. Each tag consists of a key and an optional value, both of which you define.
        public let tags: [String: String]?

        public init(deploymentDurationInMinutes: Int, description: String? = nil, finalBakeTimeInMinutes: Int? = nil, growthFactor: Float, growthType: GrowthType? = nil, name: String, replicateTo: ReplicateTo, tags: [String: String]? = nil) {
            self.deploymentDurationInMinutes = deploymentDurationInMinutes
            self.description = description
            self.finalBakeTimeInMinutes = finalBakeTimeInMinutes
            self.growthFactor = growthFactor
            self.growthType = growthType
            self.name = name
            self.replicateTo = replicateTo
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.deploymentDurationInMinutes, name: "deploymentDurationInMinutes", parent: name, max: 1440)
            try self.validate(self.deploymentDurationInMinutes, name: "deploymentDurationInMinutes", parent: name, min: 0)
            try self.validate(self.description, name: "description", parent: name, max: 1024)
            try self.validate(self.description, name: "description", parent: name, min: 0)
            try self.validate(self.finalBakeTimeInMinutes, name: "finalBakeTimeInMinutes", parent: name, max: 1440)
            try self.validate(self.finalBakeTimeInMinutes, name: "finalBakeTimeInMinutes", parent: name, min: 0)
            try self.validate(self.growthFactor, name: "growthFactor", parent: name, max: 100)
            try self.validate(self.growthFactor, name: "growthFactor", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, max: 64)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.tags?.forEach {
                try validate($0.key, name: "tags.key", parent: name, max: 128)
                try validate($0.key, name: "tags.key", parent: name, min: 1)
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, max: 256)
            }
        }

        private enum CodingKeys: String, CodingKey {
            case deploymentDurationInMinutes = "DeploymentDurationInMinutes"
            case description = "Description"
            case finalBakeTimeInMinutes = "FinalBakeTimeInMinutes"
            case growthFactor = "GrowthFactor"
            case growthType = "GrowthType"
            case name = "Name"
            case replicateTo = "ReplicateTo"
            case tags = "Tags"
        }
    }

    public struct CreateEnvironmentRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "applicationId", location: .uri(locationName: "ApplicationId"))
        ]

        /// The application ID.
        public let applicationId: String
        /// A description of the environment.
        public let description: String?
        /// Amazon CloudWatch alarms to monitor during the deployment process.
        public let monitors: [Monitor]?
        /// A name for the environment.
        public let name: String
        /// Metadata to assign to the environment. Tags help organize and categorize your AppConfig resources. Each tag consists of a key and an optional value, both of which you define.
        public let tags: [String: String]?

        public init(applicationId: String, description: String? = nil, monitors: [Monitor]? = nil, name: String, tags: [String: String]? = nil) {
            self.applicationId = applicationId
            self.description = description
            self.monitors = monitors
            self.name = name
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationId, name: "applicationId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.description, name: "description", parent: name, max: 1024)
            try self.validate(self.description, name: "description", parent: name, min: 0)
            try self.monitors?.forEach {
                try $0.validate(name: "\(name).monitors[]")
            }
            try self.validate(self.monitors, name: "monitors", parent: name, max: 5)
            try self.validate(self.monitors, name: "monitors", parent: name, min: 0)
            try self.validate(self.name, name: "name", parent: name, max: 64)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.tags?.forEach {
                try validate($0.key, name: "tags.key", parent: name, max: 128)
                try validate($0.key, name: "tags.key", parent: name, min: 1)
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, max: 256)
            }
        }

        private enum CodingKeys: String, CodingKey {
            case description = "Description"
            case monitors = "Monitors"
            case name = "Name"
            case tags = "Tags"
        }
    }

    public struct CreateHostedConfigurationVersionRequest: AWSEncodableShape & AWSShapeWithPayload {
        /// The key for the payload
        public static let _payloadPath: String = "content"
        public static let _payloadOptions: AWSShapePayloadOptions = [.raw]
        public static var _encoding = [
            AWSMemberEncoding(label: "applicationId", location: .uri(locationName: "ApplicationId")),
            AWSMemberEncoding(label: "configurationProfileId", location: .uri(locationName: "ConfigurationProfileId")),
            AWSMemberEncoding(label: "content", location: .body(locationName: "Content")),
            AWSMemberEncoding(label: "contentType", location: .header(locationName: "Content-Type")),
            AWSMemberEncoding(label: "description", location: .header(locationName: "Description")),
            AWSMemberEncoding(label: "latestVersionNumber", location: .header(locationName: "Latest-Version-Number"))
        ]

        /// The application ID.
        public let applicationId: String
        /// The configuration profile ID.
        public let configurationProfileId: String
        /// The content of the configuration or the configuration data.
        public let content: AWSPayload
        /// A standard MIME type describing the format of the configuration content. For more information, see Content-Type.
        public let contentType: String
        /// A description of the configuration.
        public let description: String?
        /// An optional locking token used to prevent race conditions from overwriting configuration updates when creating a new version. To ensure your data is not overwritten when creating multiple hosted configuration versions in rapid succession, specify the version of the latest hosted configuration version.
        public let latestVersionNumber: Int?

        public init(applicationId: String, configurationProfileId: String, content: AWSPayload, contentType: String, description: String? = nil, latestVersionNumber: Int? = nil) {
            self.applicationId = applicationId
            self.configurationProfileId = configurationProfileId
            self.content = content
            self.contentType = contentType
            self.description = description
            self.latestVersionNumber = latestVersionNumber
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationId, name: "applicationId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.configurationProfileId, name: "configurationProfileId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.contentType, name: "contentType", parent: name, max: 255)
            try self.validate(self.contentType, name: "contentType", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, max: 1024)
            try self.validate(self.description, name: "description", parent: name, min: 0)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct DeleteApplicationRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "applicationId", location: .uri(locationName: "ApplicationId"))
        ]

        /// The ID of the application to delete.
        public let applicationId: String

        public init(applicationId: String) {
            self.applicationId = applicationId
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationId, name: "applicationId", parent: name, pattern: "[a-z0-9]{4,7}")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct DeleteConfigurationProfileRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "applicationId", location: .uri(locationName: "ApplicationId")),
            AWSMemberEncoding(label: "configurationProfileId", location: .uri(locationName: "ConfigurationProfileId"))
        ]

        /// The application ID that includes the configuration profile you want to delete.
        public let applicationId: String
        /// The ID of the configuration profile you want to delete.
        public let configurationProfileId: String

        public init(applicationId: String, configurationProfileId: String) {
            self.applicationId = applicationId
            self.configurationProfileId = configurationProfileId
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationId, name: "applicationId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.configurationProfileId, name: "configurationProfileId", parent: name, pattern: "[a-z0-9]{4,7}")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct DeleteDeploymentStrategyRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "deploymentStrategyId", location: .uri(locationName: "DeploymentStrategyId"))
        ]

        /// The ID of the deployment strategy you want to delete.
        public let deploymentStrategyId: String

        public init(deploymentStrategyId: String) {
            self.deploymentStrategyId = deploymentStrategyId
        }

        public func validate(name: String) throws {
            try self.validate(self.deploymentStrategyId, name: "deploymentStrategyId", parent: name, pattern: "(^[a-z0-9]{4,7}$|^AppConfig\\.[A-Za-z0-9]{9,40}$)")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct DeleteEnvironmentRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "applicationId", location: .uri(locationName: "ApplicationId")),
            AWSMemberEncoding(label: "environmentId", location: .uri(locationName: "EnvironmentId"))
        ]

        /// The application ID that includes the environment you want to delete.
        public let applicationId: String
        /// The ID of the environment you want to delete.
        public let environmentId: String

        public init(applicationId: String, environmentId: String) {
            self.applicationId = applicationId
            self.environmentId = environmentId
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationId, name: "applicationId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.environmentId, name: "environmentId", parent: name, pattern: "[a-z0-9]{4,7}")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct DeleteHostedConfigurationVersionRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "applicationId", location: .uri(locationName: "ApplicationId")),
            AWSMemberEncoding(label: "configurationProfileId", location: .uri(locationName: "ConfigurationProfileId")),
            AWSMemberEncoding(label: "versionNumber", location: .uri(locationName: "VersionNumber"))
        ]

        /// The application ID.
        public let applicationId: String
        /// The configuration profile ID.
        public let configurationProfileId: String
        /// The versions number to delete.
        public let versionNumber: Int

        public init(applicationId: String, configurationProfileId: String, versionNumber: Int) {
            self.applicationId = applicationId
            self.configurationProfileId = configurationProfileId
            self.versionNumber = versionNumber
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationId, name: "applicationId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.configurationProfileId, name: "configurationProfileId", parent: name, pattern: "[a-z0-9]{4,7}")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct Deployment: AWSDecodableShape {
        /// The ID of the application that was deployed.
        public let applicationId: String?
        /// The time the deployment completed.
        @OptionalCustomCoding<ISO8601DateCoder>
        public var completedAt: Date?
        /// Information about the source location of the configuration.
        public let configurationLocationUri: String?
        /// The name of the configuration.
        public let configurationName: String?
        /// The ID of the configuration profile that was deployed.
        public let configurationProfileId: String?
        /// The configuration version that was deployed.
        public let configurationVersion: String?
        /// Total amount of time the deployment lasted.
        public let deploymentDurationInMinutes: Int?
        /// The sequence number of the deployment.
        public let deploymentNumber: Int?
        /// The ID of the deployment strategy that was deployed.
        public let deploymentStrategyId: String?
        /// The description of the deployment.
        public let description: String?
        /// The ID of the environment that was deployed.
        public let environmentId: String?
        /// A list containing all events related to a deployment. The most recent events are displayed first.
        public let eventLog: [DeploymentEvent]?
        /// The amount of time AppConfig monitored for alarms before considering the deployment to be complete and no longer eligible for automatic roll back.
        public let finalBakeTimeInMinutes: Int?
        /// The percentage of targets to receive a deployed configuration during each interval.
        public let growthFactor: Float?
        /// The algorithm used to define how percentage grew over time.
        public let growthType: GrowthType?
        /// The percentage of targets for which the deployment is available.
        public let percentageComplete: Float?
        /// The time the deployment started.
        @OptionalCustomCoding<ISO8601DateCoder>
        public var startedAt: Date?
        /// The state of the deployment.
        public let state: DeploymentState?

        public init(applicationId: String? = nil, completedAt: Date? = nil, configurationLocationUri: String? = nil, configurationName: String? = nil, configurationProfileId: String? = nil, configurationVersion: String? = nil, deploymentDurationInMinutes: Int? = nil, deploymentNumber: Int? = nil, deploymentStrategyId: String? = nil, description: String? = nil, environmentId: String? = nil, eventLog: [DeploymentEvent]? = nil, finalBakeTimeInMinutes: Int? = nil, growthFactor: Float? = nil, growthType: GrowthType? = nil, percentageComplete: Float? = nil, startedAt: Date? = nil, state: DeploymentState? = nil) {
            self.applicationId = applicationId
            self.completedAt = completedAt
            self.configurationLocationUri = configurationLocationUri
            self.configurationName = configurationName
            self.configurationProfileId = configurationProfileId
            self.configurationVersion = configurationVersion
            self.deploymentDurationInMinutes = deploymentDurationInMinutes
            self.deploymentNumber = deploymentNumber
            self.deploymentStrategyId = deploymentStrategyId
            self.description = description
            self.environmentId = environmentId
            self.eventLog = eventLog
            self.finalBakeTimeInMinutes = finalBakeTimeInMinutes
            self.growthFactor = growthFactor
            self.growthType = growthType
            self.percentageComplete = percentageComplete
            self.startedAt = startedAt
            self.state = state
        }

        private enum CodingKeys: String, CodingKey {
            case applicationId = "ApplicationId"
            case completedAt = "CompletedAt"
            case configurationLocationUri = "ConfigurationLocationUri"
            case configurationName = "ConfigurationName"
            case configurationProfileId = "ConfigurationProfileId"
            case configurationVersion = "ConfigurationVersion"
            case deploymentDurationInMinutes = "DeploymentDurationInMinutes"
            case deploymentNumber = "DeploymentNumber"
            case deploymentStrategyId = "DeploymentStrategyId"
            case description = "Description"
            case environmentId = "EnvironmentId"
            case eventLog = "EventLog"
            case finalBakeTimeInMinutes = "FinalBakeTimeInMinutes"
            case growthFactor = "GrowthFactor"
            case growthType = "GrowthType"
            case percentageComplete = "PercentageComplete"
            case startedAt = "StartedAt"
            case state = "State"
        }
    }

    public struct DeploymentEvent: AWSDecodableShape {
        /// A description of the deployment event. Descriptions include, but are not limited to, the user account or the CloudWatch alarm ARN that initiated a rollback, the percentage of hosts that received the deployment, or in the case of an internal error, a recommendation to attempt a new deployment.
        public let description: String?
        /// The type of deployment event. Deployment event types include the start, stop, or completion of a deployment; a percentage update; the start or stop of a bake period; the start or completion of a rollback.
        public let eventType: DeploymentEventType?
        /// The date and time the event occurred.
        @OptionalCustomCoding<ISO8601DateCoder>
        public var occurredAt: Date?
        /// The entity that triggered the deployment event. Events can be triggered by a user, AWS AppConfig, an Amazon CloudWatch alarm, or an internal error.
        public let triggeredBy: TriggeredBy?

        public init(description: String? = nil, eventType: DeploymentEventType? = nil, occurredAt: Date? = nil, triggeredBy: TriggeredBy? = nil) {
            self.description = description
            self.eventType = eventType
            self.occurredAt = occurredAt
            self.triggeredBy = triggeredBy
        }

        private enum CodingKeys: String, CodingKey {
            case description = "Description"
            case eventType = "EventType"
            case occurredAt = "OccurredAt"
            case triggeredBy = "TriggeredBy"
        }
    }

    public struct DeploymentStrategies: AWSDecodableShape {
        /// The elements from this collection.
        public let items: [DeploymentStrategy]?
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?

        public init(items: [DeploymentStrategy]? = nil, nextToken: String? = nil) {
            self.items = items
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case items = "Items"
            case nextToken = "NextToken"
        }
    }

    public struct DeploymentStrategy: AWSDecodableShape {
        /// Total amount of time the deployment lasted.
        public let deploymentDurationInMinutes: Int?
        /// The description of the deployment strategy.
        public let description: String?
        /// The amount of time AppConfig monitored for alarms before considering the deployment to be complete and no longer eligible for automatic roll back.
        public let finalBakeTimeInMinutes: Int?
        /// The percentage of targets that received a deployed configuration during each interval.
        public let growthFactor: Float?
        /// The algorithm used to define how percentage grew over time.
        public let growthType: GrowthType?
        /// The deployment strategy ID.
        public let id: String?
        /// The name of the deployment strategy.
        public let name: String?
        /// Save the deployment strategy to a Systems Manager (SSM) document.
        public let replicateTo: ReplicateTo?

        public init(deploymentDurationInMinutes: Int? = nil, description: String? = nil, finalBakeTimeInMinutes: Int? = nil, growthFactor: Float? = nil, growthType: GrowthType? = nil, id: String? = nil, name: String? = nil, replicateTo: ReplicateTo? = nil) {
            self.deploymentDurationInMinutes = deploymentDurationInMinutes
            self.description = description
            self.finalBakeTimeInMinutes = finalBakeTimeInMinutes
            self.growthFactor = growthFactor
            self.growthType = growthType
            self.id = id
            self.name = name
            self.replicateTo = replicateTo
        }

        private enum CodingKeys: String, CodingKey {
            case deploymentDurationInMinutes = "DeploymentDurationInMinutes"
            case description = "Description"
            case finalBakeTimeInMinutes = "FinalBakeTimeInMinutes"
            case growthFactor = "GrowthFactor"
            case growthType = "GrowthType"
            case id = "Id"
            case name = "Name"
            case replicateTo = "ReplicateTo"
        }
    }

    public struct DeploymentSummary: AWSDecodableShape {
        /// Time the deployment completed.
        @OptionalCustomCoding<ISO8601DateCoder>
        public var completedAt: Date?
        /// The name of the configuration.
        public let configurationName: String?
        /// The version of the configuration.
        public let configurationVersion: String?
        /// Total amount of time the deployment lasted.
        public let deploymentDurationInMinutes: Int?
        /// The sequence number of the deployment.
        public let deploymentNumber: Int?
        /// The amount of time AppConfig monitors for alarms before considering the deployment to be complete and no longer eligible for automatic roll back.
        public let finalBakeTimeInMinutes: Int?
        /// The percentage of targets to receive a deployed configuration during each interval.
        public let growthFactor: Float?
        /// The algorithm used to define how percentage grows over time.
        public let growthType: GrowthType?
        /// The percentage of targets for which the deployment is available.
        public let percentageComplete: Float?
        /// Time the deployment started.
        @OptionalCustomCoding<ISO8601DateCoder>
        public var startedAt: Date?
        /// The state of the deployment.
        public let state: DeploymentState?

        public init(completedAt: Date? = nil, configurationName: String? = nil, configurationVersion: String? = nil, deploymentDurationInMinutes: Int? = nil, deploymentNumber: Int? = nil, finalBakeTimeInMinutes: Int? = nil, growthFactor: Float? = nil, growthType: GrowthType? = nil, percentageComplete: Float? = nil, startedAt: Date? = nil, state: DeploymentState? = nil) {
            self.completedAt = completedAt
            self.configurationName = configurationName
            self.configurationVersion = configurationVersion
            self.deploymentDurationInMinutes = deploymentDurationInMinutes
            self.deploymentNumber = deploymentNumber
            self.finalBakeTimeInMinutes = finalBakeTimeInMinutes
            self.growthFactor = growthFactor
            self.growthType = growthType
            self.percentageComplete = percentageComplete
            self.startedAt = startedAt
            self.state = state
        }

        private enum CodingKeys: String, CodingKey {
            case completedAt = "CompletedAt"
            case configurationName = "ConfigurationName"
            case configurationVersion = "ConfigurationVersion"
            case deploymentDurationInMinutes = "DeploymentDurationInMinutes"
            case deploymentNumber = "DeploymentNumber"
            case finalBakeTimeInMinutes = "FinalBakeTimeInMinutes"
            case growthFactor = "GrowthFactor"
            case growthType = "GrowthType"
            case percentageComplete = "PercentageComplete"
            case startedAt = "StartedAt"
            case state = "State"
        }
    }

    public struct Deployments: AWSDecodableShape {
        /// The elements from this collection.
        public let items: [DeploymentSummary]?
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?

        public init(items: [DeploymentSummary]? = nil, nextToken: String? = nil) {
            self.items = items
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case items = "Items"
            case nextToken = "NextToken"
        }
    }

    public struct Environment: AWSDecodableShape {
        /// The application ID.
        public let applicationId: String?
        /// The description of the environment.
        public let description: String?
        /// The environment ID.
        public let id: String?
        /// Amazon CloudWatch alarms monitored during the deployment.
        public let monitors: [Monitor]?
        /// The name of the environment.
        public let name: String?
        /// The state of the environment. An environment can be in one of the following states: READY_FOR_DEPLOYMENT, DEPLOYING, ROLLING_BACK, or ROLLED_BACK
        public let state: EnvironmentState?

        public init(applicationId: String? = nil, description: String? = nil, id: String? = nil, monitors: [Monitor]? = nil, name: String? = nil, state: EnvironmentState? = nil) {
            self.applicationId = applicationId
            self.description = description
            self.id = id
            self.monitors = monitors
            self.name = name
            self.state = state
        }

        private enum CodingKeys: String, CodingKey {
            case applicationId = "ApplicationId"
            case description = "Description"
            case id = "Id"
            case monitors = "Monitors"
            case name = "Name"
            case state = "State"
        }
    }

    public struct Environments: AWSDecodableShape {
        /// The elements from this collection.
        public let items: [Environment]?
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?

        public init(items: [Environment]? = nil, nextToken: String? = nil) {
            self.items = items
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case items = "Items"
            case nextToken = "NextToken"
        }
    }

    public struct GetApplicationRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "applicationId", location: .uri(locationName: "ApplicationId"))
        ]

        /// The ID of the application you want to get.
        public let applicationId: String

        public init(applicationId: String) {
            self.applicationId = applicationId
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationId, name: "applicationId", parent: name, pattern: "[a-z0-9]{4,7}")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct GetConfigurationProfileRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "applicationId", location: .uri(locationName: "ApplicationId")),
            AWSMemberEncoding(label: "configurationProfileId", location: .uri(locationName: "ConfigurationProfileId"))
        ]

        /// The ID of the application that includes the configuration profile you want to get.
        public let applicationId: String
        /// The ID of the configuration profile you want to get.
        public let configurationProfileId: String

        public init(applicationId: String, configurationProfileId: String) {
            self.applicationId = applicationId
            self.configurationProfileId = configurationProfileId
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationId, name: "applicationId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.configurationProfileId, name: "configurationProfileId", parent: name, pattern: "[a-z0-9]{4,7}")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct GetConfigurationRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "application", location: .uri(locationName: "Application")),
            AWSMemberEncoding(label: "clientConfigurationVersion", location: .querystring(locationName: "client_configuration_version")),
            AWSMemberEncoding(label: "clientId", location: .querystring(locationName: "client_id")),
            AWSMemberEncoding(label: "configuration", location: .uri(locationName: "Configuration")),
            AWSMemberEncoding(label: "environment", location: .uri(locationName: "Environment"))
        ]

        /// The application to get. Specify either the application name or the application ID.
        public let application: String
        /// The configuration version returned in the most recent GetConfiguration response.  AWS AppConfig uses the value of the ClientConfigurationVersion parameter to identify the configuration version on your clients. If you don’t send ClientConfigurationVersion with each call to GetConfiguration, your clients receive the current configuration. You are charged each time your clients receive a configuration. To avoid excess charges, we recommend that you include the ClientConfigurationVersion value with every call to GetConfiguration. This value must be saved on your client. Subsequent calls to GetConfiguration must pass this value by using the ClientConfigurationVersion parameter.   For more information about working with configurations, see Retrieving the Configuration in the AWS AppConfig User Guide.
        public let clientConfigurationVersion: String?
        /// A unique ID to identify the client for the configuration. This ID enables AppConfig to deploy the configuration in intervals, as defined in the deployment strategy.
        public let clientId: String
        /// The configuration to get. Specify either the configuration name or the configuration ID.
        public let configuration: String
        /// The environment to get. Specify either the environment name or the environment ID.
        public let environment: String

        public init(application: String, clientConfigurationVersion: String? = nil, clientId: String, configuration: String, environment: String) {
            self.application = application
            self.clientConfigurationVersion = clientConfigurationVersion
            self.clientId = clientId
            self.configuration = configuration
            self.environment = environment
        }

        public func validate(name: String) throws {
            try self.validate(self.application, name: "application", parent: name, max: 64)
            try self.validate(self.application, name: "application", parent: name, min: 1)
            try self.validate(self.clientConfigurationVersion, name: "clientConfigurationVersion", parent: name, max: 1024)
            try self.validate(self.clientConfigurationVersion, name: "clientConfigurationVersion", parent: name, min: 1)
            try self.validate(self.clientId, name: "clientId", parent: name, max: 64)
            try self.validate(self.clientId, name: "clientId", parent: name, min: 1)
            try self.validate(self.configuration, name: "configuration", parent: name, max: 64)
            try self.validate(self.configuration, name: "configuration", parent: name, min: 1)
            try self.validate(self.environment, name: "environment", parent: name, max: 64)
            try self.validate(self.environment, name: "environment", parent: name, min: 1)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct GetDeploymentRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "applicationId", location: .uri(locationName: "ApplicationId")),
            AWSMemberEncoding(label: "deploymentNumber", location: .uri(locationName: "DeploymentNumber")),
            AWSMemberEncoding(label: "environmentId", location: .uri(locationName: "EnvironmentId"))
        ]

        /// The ID of the application that includes the deployment you want to get.
        public let applicationId: String
        /// The sequence number of the deployment.
        public let deploymentNumber: Int
        /// The ID of the environment that includes the deployment you want to get.
        public let environmentId: String

        public init(applicationId: String, deploymentNumber: Int, environmentId: String) {
            self.applicationId = applicationId
            self.deploymentNumber = deploymentNumber
            self.environmentId = environmentId
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationId, name: "applicationId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.environmentId, name: "environmentId", parent: name, pattern: "[a-z0-9]{4,7}")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct GetDeploymentStrategyRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "deploymentStrategyId", location: .uri(locationName: "DeploymentStrategyId"))
        ]

        /// The ID of the deployment strategy to get.
        public let deploymentStrategyId: String

        public init(deploymentStrategyId: String) {
            self.deploymentStrategyId = deploymentStrategyId
        }

        public func validate(name: String) throws {
            try self.validate(self.deploymentStrategyId, name: "deploymentStrategyId", parent: name, pattern: "(^[a-z0-9]{4,7}$|^AppConfig\\.[A-Za-z0-9]{9,40}$)")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct GetEnvironmentRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "applicationId", location: .uri(locationName: "ApplicationId")),
            AWSMemberEncoding(label: "environmentId", location: .uri(locationName: "EnvironmentId"))
        ]

        /// The ID of the application that includes the environment you want to get.
        public let applicationId: String
        /// The ID of the environment you wnat to get.
        public let environmentId: String

        public init(applicationId: String, environmentId: String) {
            self.applicationId = applicationId
            self.environmentId = environmentId
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationId, name: "applicationId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.environmentId, name: "environmentId", parent: name, pattern: "[a-z0-9]{4,7}")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct GetHostedConfigurationVersionRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "applicationId", location: .uri(locationName: "ApplicationId")),
            AWSMemberEncoding(label: "configurationProfileId", location: .uri(locationName: "ConfigurationProfileId")),
            AWSMemberEncoding(label: "versionNumber", location: .uri(locationName: "VersionNumber"))
        ]

        /// The application ID.
        public let applicationId: String
        /// The configuration profile ID.
        public let configurationProfileId: String
        /// The version.
        public let versionNumber: Int

        public init(applicationId: String, configurationProfileId: String, versionNumber: Int) {
            self.applicationId = applicationId
            self.configurationProfileId = configurationProfileId
            self.versionNumber = versionNumber
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationId, name: "applicationId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.configurationProfileId, name: "configurationProfileId", parent: name, pattern: "[a-z0-9]{4,7}")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct HostedConfigurationVersion: AWSDecodableShape & AWSShapeWithPayload {
        /// The key for the payload
        public static let _payloadPath: String = "content"
        public static let _payloadOptions: AWSShapePayloadOptions = [.raw]
        public static var _encoding = [
            AWSMemberEncoding(label: "applicationId", location: .header(locationName: "Application-Id")),
            AWSMemberEncoding(label: "configurationProfileId", location: .header(locationName: "Configuration-Profile-Id")),
            AWSMemberEncoding(label: "content", location: .body(locationName: "Content")),
            AWSMemberEncoding(label: "contentType", location: .header(locationName: "Content-Type")),
            AWSMemberEncoding(label: "description", location: .header(locationName: "Description")),
            AWSMemberEncoding(label: "versionNumber", location: .header(locationName: "Version-Number"))
        ]

        /// The application ID.
        public let applicationId: String?
        /// The configuration profile ID.
        public let configurationProfileId: String?
        /// The content of the configuration or the configuration data.
        public let content: AWSPayload?
        /// A standard MIME type describing the format of the configuration content. For more information, see Content-Type.
        public let contentType: String?
        /// A description of the configuration.
        public let description: String?
        /// The configuration version.
        public let versionNumber: Int?

        public init(applicationId: String? = nil, configurationProfileId: String? = nil, content: AWSPayload? = nil, contentType: String? = nil, description: String? = nil, versionNumber: Int? = nil) {
            self.applicationId = applicationId
            self.configurationProfileId = configurationProfileId
            self.content = content
            self.contentType = contentType
            self.description = description
            self.versionNumber = versionNumber
        }

        private enum CodingKeys: String, CodingKey {
            case applicationId = "Application-Id"
            case configurationProfileId = "Configuration-Profile-Id"
            case content = "Content"
            case contentType = "Content-Type"
            case description = "Description"
            case versionNumber = "Version-Number"
        }
    }

    public struct HostedConfigurationVersionSummary: AWSDecodableShape {
        /// The application ID.
        public let applicationId: String?
        /// The configuration profile ID.
        public let configurationProfileId: String?
        /// A standard MIME type describing the format of the configuration content. For more information, see Content-Type.
        public let contentType: String?
        /// A description of the configuration.
        public let description: String?
        /// The configuration version.
        public let versionNumber: Int?

        public init(applicationId: String? = nil, configurationProfileId: String? = nil, contentType: String? = nil, description: String? = nil, versionNumber: Int? = nil) {
            self.applicationId = applicationId
            self.configurationProfileId = configurationProfileId
            self.contentType = contentType
            self.description = description
            self.versionNumber = versionNumber
        }

        private enum CodingKeys: String, CodingKey {
            case applicationId = "ApplicationId"
            case configurationProfileId = "ConfigurationProfileId"
            case contentType = "ContentType"
            case description = "Description"
            case versionNumber = "VersionNumber"
        }
    }

    public struct HostedConfigurationVersions: AWSDecodableShape {
        /// The elements from this collection.
        public let items: [HostedConfigurationVersionSummary]?
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?

        public init(items: [HostedConfigurationVersionSummary]? = nil, nextToken: String? = nil) {
            self.items = items
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case items = "Items"
            case nextToken = "NextToken"
        }
    }

    public struct ListApplicationsRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "maxResults", location: .querystring(locationName: "max_results")),
            AWSMemberEncoding(label: "nextToken", location: .querystring(locationName: "next_token"))
        ]

        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// A token to start the list. Use this token to get the next set of results.
        public let nextToken: String?

        public init(maxResults: Int? = nil, nextToken: String? = nil) {
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 2048)
            try self.validate(self.nextToken, name: "nextToken", parent: name, min: 1)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListConfigurationProfilesRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "applicationId", location: .uri(locationName: "ApplicationId")),
            AWSMemberEncoding(label: "maxResults", location: .querystring(locationName: "max_results")),
            AWSMemberEncoding(label: "nextToken", location: .querystring(locationName: "next_token"))
        ]

        /// The application ID.
        public let applicationId: String
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// A token to start the list. Use this token to get the next set of results.
        public let nextToken: String?

        public init(applicationId: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.applicationId = applicationId
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationId, name: "applicationId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 2048)
            try self.validate(self.nextToken, name: "nextToken", parent: name, min: 1)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListDeploymentStrategiesRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "maxResults", location: .querystring(locationName: "max_results")),
            AWSMemberEncoding(label: "nextToken", location: .querystring(locationName: "next_token"))
        ]

        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// A token to start the list. Use this token to get the next set of results.
        public let nextToken: String?

        public init(maxResults: Int? = nil, nextToken: String? = nil) {
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 2048)
            try self.validate(self.nextToken, name: "nextToken", parent: name, min: 1)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListDeploymentsRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "applicationId", location: .uri(locationName: "ApplicationId")),
            AWSMemberEncoding(label: "environmentId", location: .uri(locationName: "EnvironmentId")),
            AWSMemberEncoding(label: "maxResults", location: .querystring(locationName: "max_results")),
            AWSMemberEncoding(label: "nextToken", location: .querystring(locationName: "next_token"))
        ]

        /// The application ID.
        public let applicationId: String
        /// The environment ID.
        public let environmentId: String
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// A token to start the list. Use this token to get the next set of results.
        public let nextToken: String?

        public init(applicationId: String, environmentId: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.applicationId = applicationId
            self.environmentId = environmentId
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationId, name: "applicationId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.environmentId, name: "environmentId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 2048)
            try self.validate(self.nextToken, name: "nextToken", parent: name, min: 1)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListEnvironmentsRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "applicationId", location: .uri(locationName: "ApplicationId")),
            AWSMemberEncoding(label: "maxResults", location: .querystring(locationName: "max_results")),
            AWSMemberEncoding(label: "nextToken", location: .querystring(locationName: "next_token"))
        ]

        /// The application ID.
        public let applicationId: String
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// A token to start the list. Use this token to get the next set of results.
        public let nextToken: String?

        public init(applicationId: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.applicationId = applicationId
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationId, name: "applicationId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 2048)
            try self.validate(self.nextToken, name: "nextToken", parent: name, min: 1)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListHostedConfigurationVersionsRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "applicationId", location: .uri(locationName: "ApplicationId")),
            AWSMemberEncoding(label: "configurationProfileId", location: .uri(locationName: "ConfigurationProfileId")),
            AWSMemberEncoding(label: "maxResults", location: .querystring(locationName: "max_results")),
            AWSMemberEncoding(label: "nextToken", location: .querystring(locationName: "next_token"))
        ]

        /// The application ID.
        public let applicationId: String
        /// The configuration profile ID.
        public let configurationProfileId: String
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// A token to start the list. Use this token to get the next set of results.
        public let nextToken: String?

        public init(applicationId: String, configurationProfileId: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.applicationId = applicationId
            self.configurationProfileId = configurationProfileId
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationId, name: "applicationId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.configurationProfileId, name: "configurationProfileId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 2048)
            try self.validate(self.nextToken, name: "nextToken", parent: name, min: 1)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListTagsForResourceRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "resourceArn", location: .uri(locationName: "ResourceArn"))
        ]

        /// The resource ARN.
        public let resourceArn: String

        public init(resourceArn: String) {
            self.resourceArn = resourceArn
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, max: 2048)
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, min: 20)
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, pattern: "arn:(aws[a-zA-Z-]*)?:[a-z]+:([a-z]{2}((-gov)|(-iso(b?)))?-[a-z]+-\\d{1})?:(\\d{12})?:[a-zA-Z0-9-_/:.]+")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct Monitor: AWSEncodableShape & AWSDecodableShape {
        /// ARN of the Amazon CloudWatch alarm.
        public let alarmArn: String?
        /// ARN of an IAM role for AppConfig to monitor AlarmArn.
        public let alarmRoleArn: String?

        public init(alarmArn: String? = nil, alarmRoleArn: String? = nil) {
            self.alarmArn = alarmArn
            self.alarmRoleArn = alarmRoleArn
        }

        public func validate(name: String) throws {
            try self.validate(self.alarmArn, name: "alarmArn", parent: name, max: 2048)
            try self.validate(self.alarmArn, name: "alarmArn", parent: name, min: 20)
            try self.validate(self.alarmArn, name: "alarmArn", parent: name, pattern: "arn:(aws[a-zA-Z-]*)?:[a-z]+:([a-z]{2}((-gov)|(-iso(b?)))?-[a-z]+-\\d{1})?:(\\d{12})?:[a-zA-Z0-9-_/:.]+")
            try self.validate(self.alarmRoleArn, name: "alarmRoleArn", parent: name, max: 2048)
            try self.validate(self.alarmRoleArn, name: "alarmRoleArn", parent: name, min: 20)
            try self.validate(self.alarmRoleArn, name: "alarmRoleArn", parent: name, pattern: "^((arn):(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):(iam)::\\d{12}:role[/].*)$")
        }

        private enum CodingKeys: String, CodingKey {
            case alarmArn = "AlarmArn"
            case alarmRoleArn = "AlarmRoleArn"
        }
    }

    public struct ResourceTags: AWSDecodableShape {
        /// Metadata to assign to AppConfig resources. Tags help organize and categorize your AppConfig resources. Each tag consists of a key and an optional value, both of which you define.
        public let tags: [String: String]?

        public init(tags: [String: String]? = nil) {
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case tags = "Tags"
        }
    }

    public struct StartDeploymentRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "applicationId", location: .uri(locationName: "ApplicationId")),
            AWSMemberEncoding(label: "environmentId", location: .uri(locationName: "EnvironmentId"))
        ]

        /// The application ID.
        public let applicationId: String
        /// The configuration profile ID.
        public let configurationProfileId: String
        /// The configuration version to deploy.
        public let configurationVersion: String
        /// The deployment strategy ID.
        public let deploymentStrategyId: String
        /// A description of the deployment.
        public let description: String?
        /// The environment ID.
        public let environmentId: String
        /// Metadata to assign to the deployment. Tags help organize and categorize your AppConfig resources. Each tag consists of a key and an optional value, both of which you define.
        public let tags: [String: String]?

        public init(applicationId: String, configurationProfileId: String, configurationVersion: String, deploymentStrategyId: String, description: String? = nil, environmentId: String, tags: [String: String]? = nil) {
            self.applicationId = applicationId
            self.configurationProfileId = configurationProfileId
            self.configurationVersion = configurationVersion
            self.deploymentStrategyId = deploymentStrategyId
            self.description = description
            self.environmentId = environmentId
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationId, name: "applicationId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.configurationProfileId, name: "configurationProfileId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.configurationVersion, name: "configurationVersion", parent: name, max: 1024)
            try self.validate(self.configurationVersion, name: "configurationVersion", parent: name, min: 1)
            try self.validate(self.deploymentStrategyId, name: "deploymentStrategyId", parent: name, pattern: "(^[a-z0-9]{4,7}$|^AppConfig\\.[A-Za-z0-9]{9,40}$)")
            try self.validate(self.description, name: "description", parent: name, max: 1024)
            try self.validate(self.description, name: "description", parent: name, min: 0)
            try self.validate(self.environmentId, name: "environmentId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.tags?.forEach {
                try validate($0.key, name: "tags.key", parent: name, max: 128)
                try validate($0.key, name: "tags.key", parent: name, min: 1)
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, max: 256)
            }
        }

        private enum CodingKeys: String, CodingKey {
            case configurationProfileId = "ConfigurationProfileId"
            case configurationVersion = "ConfigurationVersion"
            case deploymentStrategyId = "DeploymentStrategyId"
            case description = "Description"
            case tags = "Tags"
        }
    }

    public struct StopDeploymentRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "applicationId", location: .uri(locationName: "ApplicationId")),
            AWSMemberEncoding(label: "deploymentNumber", location: .uri(locationName: "DeploymentNumber")),
            AWSMemberEncoding(label: "environmentId", location: .uri(locationName: "EnvironmentId"))
        ]

        /// The application ID.
        public let applicationId: String
        /// The sequence number of the deployment.
        public let deploymentNumber: Int
        /// The environment ID.
        public let environmentId: String

        public init(applicationId: String, deploymentNumber: Int, environmentId: String) {
            self.applicationId = applicationId
            self.deploymentNumber = deploymentNumber
            self.environmentId = environmentId
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationId, name: "applicationId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.environmentId, name: "environmentId", parent: name, pattern: "[a-z0-9]{4,7}")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct TagResourceRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "resourceArn", location: .uri(locationName: "ResourceArn"))
        ]

        /// The ARN of the resource for which to retrieve tags.
        public let resourceArn: String
        /// The key-value string map. The valid character set is [a-zA-Z+-=._:/]. The tag key can be up to 128 characters and must not start with aws:. The tag value can be up to 256 characters.
        public let tags: [String: String]

        public init(resourceArn: String, tags: [String: String]) {
            self.resourceArn = resourceArn
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, max: 2048)
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, min: 20)
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, pattern: "arn:(aws[a-zA-Z-]*)?:[a-z]+:([a-z]{2}((-gov)|(-iso(b?)))?-[a-z]+-\\d{1})?:(\\d{12})?:[a-zA-Z0-9-_/:.]+")
            try self.tags.forEach {
                try validate($0.key, name: "tags.key", parent: name, max: 128)
                try validate($0.key, name: "tags.key", parent: name, min: 1)
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, max: 256)
            }
        }

        private enum CodingKeys: String, CodingKey {
            case tags = "Tags"
        }
    }

    public struct UntagResourceRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "resourceArn", location: .uri(locationName: "ResourceArn")),
            AWSMemberEncoding(label: "tagKeys", location: .querystring(locationName: "tagKeys"))
        ]

        /// The ARN of the resource for which to remove tags.
        public let resourceArn: String
        /// The tag keys to delete.
        public let tagKeys: [String]

        public init(resourceArn: String, tagKeys: [String]) {
            self.resourceArn = resourceArn
            self.tagKeys = tagKeys
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, max: 2048)
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, min: 20)
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, pattern: "arn:(aws[a-zA-Z-]*)?:[a-z]+:([a-z]{2}((-gov)|(-iso(b?)))?-[a-z]+-\\d{1})?:(\\d{12})?:[a-zA-Z0-9-_/:.]+")
            try self.tagKeys.forEach {
                try validate($0, name: "tagKeys[]", parent: name, max: 128)
                try validate($0, name: "tagKeys[]", parent: name, min: 1)
            }
            try self.validate(self.tagKeys, name: "tagKeys", parent: name, max: 50)
            try self.validate(self.tagKeys, name: "tagKeys", parent: name, min: 0)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct UpdateApplicationRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "applicationId", location: .uri(locationName: "ApplicationId"))
        ]

        /// The application ID.
        public let applicationId: String
        /// A description of the application.
        public let description: String?
        /// The name of the application.
        public let name: String?

        public init(applicationId: String, description: String? = nil, name: String? = nil) {
            self.applicationId = applicationId
            self.description = description
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationId, name: "applicationId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.description, name: "description", parent: name, max: 1024)
            try self.validate(self.description, name: "description", parent: name, min: 0)
            try self.validate(self.name, name: "name", parent: name, max: 64)
            try self.validate(self.name, name: "name", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case description = "Description"
            case name = "Name"
        }
    }

    public struct UpdateConfigurationProfileRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "applicationId", location: .uri(locationName: "ApplicationId")),
            AWSMemberEncoding(label: "configurationProfileId", location: .uri(locationName: "ConfigurationProfileId"))
        ]

        /// The application ID.
        public let applicationId: String
        /// The ID of the configuration profile.
        public let configurationProfileId: String
        /// A description of the configuration profile.
        public let description: String?
        /// The name of the configuration profile.
        public let name: String?
        /// The ARN of an IAM role with permission to access the configuration at the specified LocationUri.
        public let retrievalRoleArn: String?
        /// A list of methods for validating the configuration.
        public let validators: [Validator]?

        public init(applicationId: String, configurationProfileId: String, description: String? = nil, name: String? = nil, retrievalRoleArn: String? = nil, validators: [Validator]? = nil) {
            self.applicationId = applicationId
            self.configurationProfileId = configurationProfileId
            self.description = description
            self.name = name
            self.retrievalRoleArn = retrievalRoleArn
            self.validators = validators
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationId, name: "applicationId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.configurationProfileId, name: "configurationProfileId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.description, name: "description", parent: name, max: 1024)
            try self.validate(self.description, name: "description", parent: name, min: 0)
            try self.validate(self.name, name: "name", parent: name, max: 64)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.retrievalRoleArn, name: "retrievalRoleArn", parent: name, max: 2048)
            try self.validate(self.retrievalRoleArn, name: "retrievalRoleArn", parent: name, min: 20)
            try self.validate(self.retrievalRoleArn, name: "retrievalRoleArn", parent: name, pattern: "^((arn):(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):(iam)::\\d{12}:role[/].*)$")
            try self.validators?.forEach {
                try $0.validate(name: "\(name).validators[]")
            }
            try self.validate(self.validators, name: "validators", parent: name, max: 2)
            try self.validate(self.validators, name: "validators", parent: name, min: 0)
        }

        private enum CodingKeys: String, CodingKey {
            case description = "Description"
            case name = "Name"
            case retrievalRoleArn = "RetrievalRoleArn"
            case validators = "Validators"
        }
    }

    public struct UpdateDeploymentStrategyRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "deploymentStrategyId", location: .uri(locationName: "DeploymentStrategyId"))
        ]

        /// Total amount of time for a deployment to last.
        public let deploymentDurationInMinutes: Int?
        /// The deployment strategy ID.
        public let deploymentStrategyId: String
        /// A description of the deployment strategy.
        public let description: String?
        /// The amount of time AppConfig monitors for alarms before considering the deployment to be complete and no longer eligible for automatic roll back.
        public let finalBakeTimeInMinutes: Int?
        /// The percentage of targets to receive a deployed configuration during each interval.
        public let growthFactor: Float?
        /// The algorithm used to define how percentage grows over time. AWS AppConfig supports the following growth types:  Linear: For this type, AppConfig processes the deployment by increments of the growth factor evenly distributed over the deployment time. For example, a linear deployment that uses a growth factor of 20 initially makes the configuration available to 20 percent of the targets. After 1/5th of the deployment time has passed, the system updates the percentage to 40 percent. This continues until 100% of the targets are set to receive the deployed configuration.  Exponential: For this type, AppConfig processes the deployment exponentially using the following formula: G*(2^N). In this formula, G is the growth factor specified by the user and N is the number of steps until the configuration is deployed to all targets. For example, if you specify a growth factor of 2, then the system rolls out the configuration as follows:  2*(2^0)   2*(2^1)   2*(2^2)  Expressed numerically, the deployment rolls out as follows: 2% of the targets, 4% of the targets, 8% of the targets, and continues until the configuration has been deployed to all targets.
        public let growthType: GrowthType?

        public init(deploymentDurationInMinutes: Int? = nil, deploymentStrategyId: String, description: String? = nil, finalBakeTimeInMinutes: Int? = nil, growthFactor: Float? = nil, growthType: GrowthType? = nil) {
            self.deploymentDurationInMinutes = deploymentDurationInMinutes
            self.deploymentStrategyId = deploymentStrategyId
            self.description = description
            self.finalBakeTimeInMinutes = finalBakeTimeInMinutes
            self.growthFactor = growthFactor
            self.growthType = growthType
        }

        public func validate(name: String) throws {
            try self.validate(self.deploymentDurationInMinutes, name: "deploymentDurationInMinutes", parent: name, max: 1440)
            try self.validate(self.deploymentDurationInMinutes, name: "deploymentDurationInMinutes", parent: name, min: 0)
            try self.validate(self.deploymentStrategyId, name: "deploymentStrategyId", parent: name, pattern: "(^[a-z0-9]{4,7}$|^AppConfig\\.[A-Za-z0-9]{9,40}$)")
            try self.validate(self.description, name: "description", parent: name, max: 1024)
            try self.validate(self.description, name: "description", parent: name, min: 0)
            try self.validate(self.finalBakeTimeInMinutes, name: "finalBakeTimeInMinutes", parent: name, max: 1440)
            try self.validate(self.finalBakeTimeInMinutes, name: "finalBakeTimeInMinutes", parent: name, min: 0)
            try self.validate(self.growthFactor, name: "growthFactor", parent: name, max: 100)
            try self.validate(self.growthFactor, name: "growthFactor", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case deploymentDurationInMinutes = "DeploymentDurationInMinutes"
            case description = "Description"
            case finalBakeTimeInMinutes = "FinalBakeTimeInMinutes"
            case growthFactor = "GrowthFactor"
            case growthType = "GrowthType"
        }
    }

    public struct UpdateEnvironmentRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "applicationId", location: .uri(locationName: "ApplicationId")),
            AWSMemberEncoding(label: "environmentId", location: .uri(locationName: "EnvironmentId"))
        ]

        /// The application ID.
        public let applicationId: String
        /// A description of the environment.
        public let description: String?
        /// The environment ID.
        public let environmentId: String
        /// Amazon CloudWatch alarms to monitor during the deployment process.
        public let monitors: [Monitor]?
        /// The name of the environment.
        public let name: String?

        public init(applicationId: String, description: String? = nil, environmentId: String, monitors: [Monitor]? = nil, name: String? = nil) {
            self.applicationId = applicationId
            self.description = description
            self.environmentId = environmentId
            self.monitors = monitors
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationId, name: "applicationId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.description, name: "description", parent: name, max: 1024)
            try self.validate(self.description, name: "description", parent: name, min: 0)
            try self.validate(self.environmentId, name: "environmentId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.monitors?.forEach {
                try $0.validate(name: "\(name).monitors[]")
            }
            try self.validate(self.monitors, name: "monitors", parent: name, max: 5)
            try self.validate(self.monitors, name: "monitors", parent: name, min: 0)
            try self.validate(self.name, name: "name", parent: name, max: 64)
            try self.validate(self.name, name: "name", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case description = "Description"
            case monitors = "Monitors"
            case name = "Name"
        }
    }

    public struct ValidateConfigurationRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "applicationId", location: .uri(locationName: "ApplicationId")),
            AWSMemberEncoding(label: "configurationProfileId", location: .uri(locationName: "ConfigurationProfileId")),
            AWSMemberEncoding(label: "configurationVersion", location: .querystring(locationName: "configuration_version"))
        ]

        /// The application ID.
        public let applicationId: String
        /// The configuration profile ID.
        public let configurationProfileId: String
        /// The version of the configuration to validate.
        public let configurationVersion: String

        public init(applicationId: String, configurationProfileId: String, configurationVersion: String) {
            self.applicationId = applicationId
            self.configurationProfileId = configurationProfileId
            self.configurationVersion = configurationVersion
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationId, name: "applicationId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.configurationProfileId, name: "configurationProfileId", parent: name, pattern: "[a-z0-9]{4,7}")
            try self.validate(self.configurationVersion, name: "configurationVersion", parent: name, max: 1024)
            try self.validate(self.configurationVersion, name: "configurationVersion", parent: name, min: 1)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct Validator: AWSEncodableShape & AWSDecodableShape {
        /// Either the JSON Schema content or the Amazon Resource Name (ARN) of an AWS Lambda function.
        public let content: String
        /// AppConfig supports validators of type JSON_SCHEMA and LAMBDA
        public let type: ValidatorType

        public init(content: String, type: ValidatorType) {
            self.content = content
            self.type = type
        }

        public func validate(name: String) throws {
            try self.validate(self.content, name: "content", parent: name, max: 32768)
            try self.validate(self.content, name: "content", parent: name, min: 0)
        }

        private enum CodingKeys: String, CodingKey {
            case content = "Content"
            case type = "Type"
        }
    }
}
